package org.rslai.util.io;

import java.io.BufferedWriter;
import java.io.IOException;

import org.rslai.util.env.EnvVariable;
import org.apache.commons.io.FileSystemUtils;
import org.apache.commons.io.FileUtils;

public class File {
	private static File file = new File();

	/**
	 * 私有化构造函数
	 */
	private File() {
		
	}

	/**
	 * 返回一个 File 实例
	 * @return File 实例
	 */
	public static File getInstance() {
		return file;
	}

	/**
	 * 创建目录 <br>
	 * 路径不存在创建目录，包括子目录
	 * @param pathName 路径名
	 */
	public void mkdirs(String pathName) {
		if (!(new java.io.File(pathName).isDirectory())) {
			new java.io.File(pathName).mkdirs();
		}
	}

	/**
	 * 将字符串写入到指定文件中<br>
	 * 文件不存在新建文件，文件存在覆盖
	 * @param fileName 文件名
	 * @param data 写入的字符串内容
	 * @param encoding 编码方式
	 * @throws IOException IOException
	 */
	public void writeStringToFile(String fileName, String data, String encoding) throws IOException {
		writeStringToFile(fileName, data, encoding, false);
	}

	/**
	 * 将字符串写入到指定文件中<br>
	 * 文件不存在新建文件，文件存在根据 append 参数覆盖或追加
	 * @param fileName 文件名
	 * @param data 写入的字符串内容
	 * @param encoding 编码方式
	 * @param append 是否追加方式
	 * @throws IOException IOException
	 */
	public void writeStringToFile(String fileName, String data, String encoding, boolean append) throws IOException {
		java.io.File file = new java.io.File(fileName);    
		java.io.FileOutputStream fileOutputStream = new java.io.FileOutputStream(file, append);    
		BufferedWriter bufferedWriter = new BufferedWriter(new java.io.OutputStreamWriter(fileOutputStream, encoding));

		bufferedWriter.write(data);

		bufferedWriter.flush();
		fileOutputStream.close();
		bufferedWriter.close();
	}

	/**
	 * 删除文件或删除目录和目录下的所有文件（连同目录一起删除）
	 * @param name 文件名或目录名
	 * @throws IOException IOException
	 */
	public void deleteTree(String name) throws IOException {
		java.io.File file = new java.io.File(name);

		if (file.isFile()) {
			file.delete(); // 删除文件
		} else if (file.isDirectory()) {
			FileUtils.deleteDirectory(file); // 删除目录和目录下的文件
		}
	}

	/**
	 * 清空目录下的文件（保留当前目录）
	 * @param name 目录名
	 * @throws IOException 
	 */
	public void cleanDirectory(String name) throws IOException {
		java.io.File file = new java.io.File(name);

		if (file.isDirectory()) {
			FileUtils.cleanDirectory(file);// 清空目录下的文件
		}
	}

	/**
	 * 判断文件或目录是否存在
	 * @param name 文件或目录名
	 * @return true：存在<br>
	 * false: 不存在
	 */
	public boolean isExists(String name) {
		return new java.io.File(name).exists();
	}

	/**
	 * 判断是否是目录
	 * @param name 文件或目录名
	 * @return true：是目录<br>
	 * false: 不是目录
	 */
	public boolean isDirectory(String name) {
		return new java.io.File(name).isDirectory();
	}

	/**
	 * 判断是否是文件
	 * @param name 文件或目录名
	 * @return true：是文件<br>
	 * false: 不是文件
	 */
	public boolean isFile(String name) {
		return new java.io.File(name).isFile();
	}

	/**
	 * 复制文件或目录和目录下的所有文件
	 * @param srcName 原文件名或目录名
	 * @param destName 目的文件名或目录名
	 * @throws IOException IOException
	 */
	public void xCopy(String srcName, String destName) throws IOException {
		java.io.File src = new java.io.File(srcName);
		java.io.File dest = new java.io.File(destName);

		if (!src.exists()) {
			throw new java.io.FileNotFoundException("Source '" + srcName + "' does not exist");
		} else if (src.isFile()) {
			if (dest.isDirectory()) {
				FileUtils.copyFileToDirectory(src, dest);
			} else {
				FileUtils.copyFile(src, dest);
			}
		} else if (src.isDirectory()) {
			FileUtils.copyDirectory(src, dest);
		}
	}

	/**
	 * 可以获得指定磁盘路径的可用空间<br>
	 * 例如：freeSpace("c:");
	 * @return 可用空间
	 * @throws IOException
	 */
	public long freeSpace(String path) throws IOException {
		return FileSystemUtils.freeSpace(path);
	}

	/**
	 * 返回文件或目录的大小
	 * @param name 文件或目录名
	 * @return 文件或目录的大小
	 * @throws IOException IOException
	 */
	public long sizeOf(String name) throws IOException {
		java.io.File file = new java.io.File(name);
		if (file.isFile()) {
			return file.length();
		} else if (file.isDirectory()) {
			return FileUtils.sizeOfDirectory(file);
		} else {
			throw new java.io.FileNotFoundException("'" + name + "' does not exist");
		}
	}

	/**
	 * 读取文件内容，并以字符串返回
	 * @param fileName 文件名
	 * @param encoding 编码方式
	 * @return 文件的内容
	 * @throws IOException IOException
	 */
	public String readFileToString(String fileName, String encoding) throws IOException {
		java.io.File file = new java.io.File(fileName);
		return FileUtils.readFileToString(file, encoding);
	}

	/**
	 * 得到本地文件名及其路径
	 * @param fullFileName 全文件名
	 * @return 本地文件名及其路径
	 */
	public String getFileName(String fullFileName) {
		String name = fullFileName.replace("\\\\", "\\");
		name = name.replace("\\\\", "\\");
		name = name.replace("\\", "/");
		name = name.replace("//", "/");
		name = name.replace("//", "/");
		if (EnvVariable.getInstance().getOsName().indexOf("Windows") != -1) {
			return name.replaceAll("/", EnvVariable.getInstance().getFileSeparator()+EnvVariable.getInstance().getFileSeparator());
		} else {
			return name.replaceAll("/", EnvVariable.getInstance().getFileSeparator());
		}
	}

	/**
	 * 得到目录或文件的绝对路径
	 * @param name 文件或目录名
	 * @return 绝对路径
	 */
	public String getAbsolutePath(String name) {
		return new java.io.File(name).getAbsolutePath();
	}

}
